home *** CD-ROM | disk | FTP | other *** search
/ Commodore Free 7 / Commodore_Free_Issue_07_2007_Commodore_Computer_Club.d64 / t.loadstar prg 2 < prev    next >
Text File  |  2023-02-26  |  14KB  |  589 lines

  1. uProgramming II
  2. By Dave Moorman
  3.  
  4. THE SHELL
  5. When you have played with your program
  6. long enough -- and have some idea how
  7. variables and PRINT work -- type:
  8.  
  9. NEW
  10.  
  11. We are going to now prepare a disk or
  12. disk image & save a program. As you
  13. certainly know, when you turn off a
  14. computer, anything in memory will
  15. disappear -- lost forever. To save our
  16. work, we have to SAVE our work. [If you
  17. are learning how to program from the
  18. VICE emulator on NICKEL GAMES, you
  19. won't have to do this until later. Your
  20. emulator is already "attached" to a
  21. disk image called MYDISK.D81."]
  22.  
  23. PREPARING A DISK -- REAL C-64 Connect
  24. the drive to the computer & turn both
  25. on. Type (carefully & exactly)
  26.  
  27. OPEN1,8,15,"N0:MYDISK,01":CLOSE1
  28.  
  29. And press <RETURN>. When the cursor
  30. reappears, Type:
  31.  
  32. LOAD"$",8
  33.  
  34. Then LIST.
  35.  
  36. This will show your disk directory. It
  37. also erases whatever program is in
  38. memory.
  39.  
  40. PREPARING A DISK IMAGE -- VICE
  41.  
  42. Press <Alt-8>.
  43.  
  44. Navigate to the folder where you want
  45. to keep your programs. You can create
  46. a new folder if you want -- just like
  47. with any Windows program.Type in the
  48. filename textbox:
  49.  
  50. mydisk
  51.  
  52. but do not press <ENTER> yet. Instead,
  53. look down at the lower left of the
  54. dialog box. You will see the word VICE
  55. in a textbox. Change it to
  56.  
  57. mydisk
  58.  
  59. Also change the ID to 01. Another box
  60. shows D64. This will be fine for now.
  61. Click on CREATE IMAGE. Then click OPEN.
  62. You have just created a disk image &
  63. attached it to VICE.
  64.  
  65. NOTE:
  66. Every disk or disk image should have a
  67. unique ID. We just used 01 in the above
  68. examples. Whenever you format a real
  69. disk or make a disk image, give it a
  70. different ID, which can be any 2
  71. alphanumeric characters. When you
  72. launch VICE (other than with NICKEL
  73. GAMES), you will need to "attach" a
  74. disk image to it. This is just like
  75. putting a real disk in a real drive.
  76.  
  77. Press <Alt-8>, navigate to the disk
  78. image you want (it  will have a .D64 or
  79. .D81 extension) & click OPEN.
  80.  
  81. Getting a disk directory in VICE is the
  82. same as with a real C-64:
  83.  
  84. LOAD"$",8
  85. LIST
  86.  
  87. Now you are ready to create a Scratch &
  88. Save Shell. NEW your memory & type:
  89.  
  90. 59999 END
  91. 60000 D = PEEK(186): IF D<8THEN D=8
  92. 60001 OPEN1,D,15,"I0":N$="SHELL.RTN"
  93. 60002 PRINT#1,"S0:"+N$:CLOSE1
  94. 60003 SAVE N$,D
  95. 60004 VERIFY N$,D: END
  96.  
  97. Be sure you have typed everything
  98. correctly. You MUST type out all the
  99. letters in "PRINT#1," on line 60002!
  100. Then Type:
  101.  
  102. GOTO60000
  103.  
  104. When you are successful (IE, no
  105. errors), Type:
  106.  
  107. LOAD"$",8
  108. LIST
  109.  
  110. You should see
  111.  
  112. 0 "MYDISK          " 01 2A
  113. 1 "SHELL.RTN"           PRG
  114. 663 BLOCKS FREE.
  115.  
  116. (With VICE, the disk label ("MYDISK")
  117. will look strange unless you typed in
  118. all capital letters in the textbox in
  119. the lower left of the dialog box. Press
  120. <CTRL-Shift> to make uppercase lower, &
  121. the strange characters upper case.)
  122. Now, whenever you begin a new program,
  123. load your Shell Routine with:
  124.  
  125. LOAD"SHELL.RTN",8
  126.  
  127. then
  128.  
  129. LIST 60001
  130.  
  131. And change "SHELL.RTN" to whatever you
  132. are going to call your new program. For
  133. example:
  134.  
  135. 60001 OPEN1,D,15,"I0": N$="MY FIRST"
  136.  
  137. Save your new program with
  138.  
  139. GOTO60000
  140.  
  141. While you are working on your program,
  142. take a moment every so often to type
  143. GOTO60000 in Immediate Mode. Your
  144. latest version will be saved to your
  145. disk. This technique guarantees that
  146. you will always save your program to
  147. the correct filename. Whatever name you
  148. LOAD will be the name that is scratched
  149. & saved. We won't go into all the
  150. particulars of this code, except to
  151. mention three things. First, you can
  152. put more than one command on a line. In
  153. fact, a program line can be up to 2
  154. screen lines long.
  155.  
  156. Second, notice how the numeric variable
  157. D is used. It is set to the last used
  158. device number -- usually the drive from
  159. which you loaded the program -- which
  160. the computer keeps in location 186.
  161. Disks are always device number 8 or
  162. higher. By using D, we don't have to
  163. think about which device we are using,
  164. & the same value will be used every
  165. time. Third, by making N$ hold the name
  166. of the program, we know that the
  167. correct filename will be scratched
  168. (S0:) & saved. This is really advanced
  169. stuff -- but it serves any programmer
  170. so well, I wanted to get you started
  171. off right. I learned to do this after a
  172. tragic experience.
  173.  
  174. I was working on two programs that
  175. worked together. "B.PROG" set things up
  176. in the computer (called a BOOT), then
  177. loaded & ran "PROG" (the main program).
  178. All went fine until I accidentally
  179. saved "B.PROG" to the file name of
  180. "PROG". Suddenly, I had two files with
  181. the Boot program, & lost the main
  182. program (and some 30 hours of work)
  183. completely. Salvation is not just a
  184. theological nicety when it comes to
  185. computers.
  186.  
  187. Check out John 3:16 to see what
  188. happens to "bad little programs!"
  189. (NOTE:  They "perish!") So I started
  190. using this scratch & save routine with
  191. every program. No matter what the name
  192. is, it is saved to the correct file-
  193. name. I learned something else. That
  194. main program was getting clunky, with
  195. lots of fixes & fixes of fixes. When I
  196. lost it, I was about two-thirds through
  197. it. By then, I really knew what I
  198. needed to do. So recreating it took
  199. only a few hours. The result was a much
  200. better, faster, more elegant program.
  201. Sometimes when a program becomes too
  202. ungainly, I clench my teeth & delete
  203. it! It means rewriting everything. But
  204. often, that is a GOOD THING.
  205.  
  206. LOOPING
  207. Computers are great at doing things
  208. over & over again. They accomplish
  209. this with a LOOP. The program that
  210. waits for keystrokes is a loop, asking
  211. "Has a key been pressed?" over & over.
  212.  
  213. Here is an Infinite LOOP:
  214.  
  215. 10 GOTO 10
  216.  
  217. When you run this, nothing will happen!
  218. The program keeps jumping to line 10,
  219. over & over. On a PC, this would be
  220. called a "lock-up!" But you have the
  221. <STOP> key (VICE: <ESC>). Press it, &
  222. you will break out of the loop. For a
  223. more useful (& interesting) loop, try
  224. this:
  225.  
  226. 10 X = 0
  227. 20 X = X + 1
  228. 30 ? X;
  229. 40 GOTO 20
  230.  
  231. Here X is set to 0, then the contents
  232. of X have 1 added, the result put back
  233. into X. This is called "incrementing."
  234. Line 30 prints X, & line 40 jumps
  235. back to line 20. X is incremented &
  236. printed, then the program loops again.
  237. Again, this is an infinite loop. The
  238. only way to stop it is to press <STOP>.
  239. What we need is to stop the program
  240. when a certain "condition" is true.
  241. Hey! we have a Conditional Jump!
  242.  
  243. 10 X = 0
  244. 20 X = X + 1
  245. 30 ? X;
  246. 40 IF X<100 THEN 20
  247. 50 END
  248.  
  249. Here, line 40 asks a conditional
  250. question. Is the value in X less than
  251. 100? If so, (THEN) we jump back to
  252. line 20. If not, we "fall through." We
  253. have several conditional operators that
  254. compare two values (or strings!).
  255.  
  256. X < A   X less than A
  257. X > A   X greater than A
  258. X <= A  X less than or equal to A
  259. X => A  X equal to or greater than A
  260. X = A   X equal to A
  261. X <> A  X not equal to A
  262.  
  263. You might want to play around with the
  264. above program until you are familiar
  265. with how all these comparisons work.
  266.  
  267. Here is an example of two nested loops:
  268.  
  269. 10 Y = 0
  270. 11 X = 0
  271. 20 ? X; Y
  272. 30 IF X < 5 THEN X = X + 1:GOTO 20
  273. 40 IF Y < 4 THEN Y = Y + 1:GOTO 11
  274. 50 END
  275.  
  276. Try to figure out what this will do
  277. before running it. One of the essential
  278. skills of a programmer is to be able to
  279. read code exactly the way the computer
  280. will. You might want to "desk check"
  281. this program.
  282. Write on a piece of paper:
  283.  
  284.  X    Y
  285. ---  ---
  286.  0    0
  287.  
  288. Then, step through the program,
  289. changing the values as the computer
  290. would:
  291.  
  292.  X    Y
  293. ---  ---
  294.  0    0
  295.  1    0
  296.  2    0
  297.  
  298. etc.
  299.  
  300. FOR-NEXT LOOPS
  301. Conditional jumps work just fine, but
  302. we have a better way to do counted
  303. loops. If you want to count from 1 to
  304. 10, you can use:
  305.  
  306. 10 FOR X = 1 TO 10
  307. 20 ? X;
  308. 30 NEXT
  309. 40 END
  310.  
  311. X is set to 1 & when the computer
  312. encounters NEXT, X is incremented.
  313. When X is greater than 10, the NEXT
  314. "falls through" to the next line.
  315.  
  316. We can count by values other than 1.
  317.  
  318. 10 FOR X = 1 TO 100 STEP 5: ? X;
  319. 20 NEXT: END
  320.  
  321. We can count backwards.
  322.  
  323. 10 FOR X = 100 TO 0 STEP - 12: ?X;
  324. 20 NEXT: END
  325.  
  326. We can even nest FOR-NEXT loops.
  327.  
  328. 10 :FOR X = 0 TO 5
  329. 20 :  FOR Y = 0 TO 5
  330. 30 :  ? X*6+Y;
  331. 40 :  NEXT
  332. 50 :?
  333. 60 :NEXT
  334. 70 END
  335.  
  336. (I indented the inner loop so it's
  337. easier to read.) One important thing to
  338. remember whenever using FOR-NEXT Loops:
  339. Always, ALWAYS exit the loop through
  340. the NEXT command. ALWAYS! Whenever a
  341. FOR command is encountered, information
  342. is stuffed away in a special place in
  343. memory called the Stack. If you do
  344. something like this:
  345.  
  346. 10 FOR X = 1 TO 10
  347. 20 IF X = 5 THEN 40
  348. 30 NEXT
  349. 40 ? X
  350. 50 END
  351.  
  352. You have jumped out of the loop
  353. illegally. The stuff on the Stack is
  354. not removed, & you can get OUT OF
  355. MEMORY ERRORs or other strange
  356. problems. If you need to jump out of a
  357. FOR-NEXT loop, use code like this:
  358.  
  359. 10 Y = 0: FOR X = 1 TO 10
  360. 20 IF X = 5 THEN Y = X: X = 100
  361. 30 NEXT
  362. 40 ? X, Y
  363. 50 END
  364.  
  365. The "found" value will be in Y. If Y is
  366. 0, then the value was not found. This
  367. will become more important later. Try
  368. this routine using different values in
  369. line 20 -- such as IF X = 55 THEN....
  370.  
  371. GOSUB
  372. We have mentioned GOTO, which jumps to
  373. a given program line number. Sometimes,
  374. you will want to use the same code at
  375. different times in a program. Rather
  376. than write the code over & over, you
  377. can write a Subroutine. This example is
  378. too simple, but here goes...
  379.  
  380.  10 FOR X = 1 TO 10
  381.  20 GOSUB 100
  382.  30 NEXT
  383.  40 GOSUB 100
  384.  50 END
  385.  60 :
  386. 100 ? X
  387. 110 RETURN
  388.  
  389. Line 100 - 110 is the subroutine. When
  390. GOSUB 100 is encountered, the program
  391. jumps to line 100. When the RETURN
  392. command is encountered, the program
  393. returns to the place where it did the
  394. GOSUB command. Be sure to keep the
  395. program from wandering into the
  396. subroutine without a GOSUB.
  397.  
  398. You will get a RETURN WITHOUT GOSUB
  399. ERROR. To see how it works, remove line
  400. 50.
  401.  
  402. ARRAYS
  403. Just one more thing before we get to
  404. the BASIC Bible -- our list of BASIC
  405. commands, functions, & operators. We
  406. have discussed how a variable is like a
  407. little box. But what if you have
  408. several boxes that are in some way
  409. related to each other? We have Arrays!
  410. If a variable is a box, an array is a 
  411. chest-of-drawers. Imagine a file
  412. cabinet called V$ that has 3 drawers.
  413. The drawers are numbered. We can put
  414. string data in drawer 0, 1, or 2.
  415.  
  416. 10 DIM V$(2)
  417.  
  418. This DIMensions the V$ array with 3
  419. "elements." We always have element 0,
  420. so DIM V$(2) has three elements.
  421.  
  422. 20 V$(0) = "DAD"
  423. 21 V$(1) = "LAD"
  424. 22 V$(2) = "MOM"
  425. 30 FOR X = 0 TO 2
  426. 40 ? V$(X)" - ";
  427. 50 NEXT: ?: END
  428.  
  429. Here is another way to "load" an array:
  430.  
  431.  10 DIM V$(3)
  432.  20 FOR X = 0 TO 3
  433.  30 READ V$(X)
  434.  40 NEXT
  435.  50 FOR X = 3 TO 0 STEP -1
  436.  60 ? V$(X)
  437.  70 NEXT
  438.  80 END
  439. 100 DATA "MOM","LAD"
  440. 101 DATA "SIS","DAD"
  441.  
  442. Each time READ is encountered, the next
  443. item in the DATA statements is read
  444. into V$(X). Each string item should be
  445. set off with double-quote marks. Also,
  446. note that no comma is used at the end
  447. of line 100.
  448.  
  449. The end of the line serves as a
  450. separator between "LAD" & "SIS". Here
  451. is something else you can do with
  452. arrays. Add these lines to the above:
  453.  
  454. 80 Y = 0: FOR X = 0 TO 3
  455. 85 IF V$(X) = "LAD" THEN Y = X:X = 3
  456. 90 NEXT:IF Y = 0 THEN ?"NOT FOUND": END
  457. 95 ? V$(Y)" FOUND!": END
  458.  
  459. You can see why it might be important
  460. to exit a FOR-NEXT loop legally! You
  461. can use arrays to hold lists of
  462. information which you can alphabetize
  463. or search. While we are at it, here is
  464. a simple way to sort an array.
  465.  
  466.  10 DIM A$(3)
  467.  15 REM READ IN THE ARRAY
  468.  20 FOR X = 0 TO 3: READ A$(X):NEXT
  469.  25 REM NOW SORT IT
  470.  30 FOR X = 0 TO 2: LO = X: LO$ = A$(X)
  471.  40 FOR Y = X + 1 TO 3
  472.  50 IF A$(Y)<LO$ THEN LO=Y:LO$=A$(Y)
  473.  60 NEXT
  474.  70 A$(LO)=A$(X)
  475.  80 A$(X)=LO$
  476.  90 NEXT
  477. 100 FOR X = 0 TO 3: ? A$(X):NEXT: END
  478. 200 DATA "MOM","SIS","LAD","DAD"
  479.  
  480. This is not necessarily the most
  481. efficient way to sort, but you get the
  482. idea. Desk check this code to see how
  483. it works. Arrays can be numeric as well
  484. as string. Just don't use the dollar
  485. sign! Also, arrays can be any number of
  486. dimensions & any size -- as long as
  487. there is enough memory. Perhaps you can
  488. have a checkerboard with 8 elements by
  489. 8 elements:
  490.  
  491. 10 DIM CB(7,7)
  492.  
  493. Or you can even do three-, four-, even
  494. five-dimensional arrays. For example,
  495. perhaps you want to make a database
  496. where you have 100 Last  Names, First
  497. Names, Addresses, Cities, States, &
  498. ZIPs -- all together in one array.
  499.  
  500. 10 DIM DB(5,100)
  501.  
  502. To sort by States, you would look at
  503. DB(4,X). Play with the idea!
  504.  
  505. C-64 SECRETS
  506. I mentioned that BASIC 2.0 does not
  507. have commands for C-64 features such
  508. as screen color. But this is fairly
  509. easily remedied. Such things are
  510. controlled by "registers," certain
  511. bytes in memory that connect to the
  512. chips that do the video stuff.
  513.  
  514. BACKGROUND COLOR  POKE 53281,color
  515. BORDER COLOR      POKE 53280,color
  516. TEXT COLOR        POKE 646,color
  517.  
  518. The color values are as follows:
  519.  
  520.   0  BLACK    8  ORANGE
  521.   1  WHITE    9  BROWN
  522.   2  RED     10 Lt RED
  523.   3  CYAN    11 DK GRAY
  524.   4  PURPLE  12 MED GRAY
  525.   5  GREEN   13 Lt GREEN
  526.   6  BLUE    14 Lt BLUE
  527.   7  YELLOW  15 Lt GRAY
  528.  
  529. Another way to change the color of the
  530. text is to "embed" color codes in a
  531. string. When you type a double-quote
  532. <Shift-2>, the edit screen goes into
  533. "quote mode." Then you can press any
  534. keys -- including color, cursor, home,
  535. or clear screen, & the action will be
  536. embedded in the string. You can try
  537. this:
  538.  
  539. 10 POKE 53280, 0
  540. 20 POKE 53281, 0
  541. 30 ?"<CTRL-2>WHITE <CTRL-3>RED ";
  542. 35 ?"<CTRL-4>CYAN"
  543. 40 ?"<C=-1>ORANGE <C=-2>BROWN ";
  544. 45 ?"<C=-3>LT. RED"
  545.  
  546. (CTRL means CONTROL. On VICE <CTRL> is
  547. <Tab>.  C= is the "chicken-lips" C= key
  548. On VICE, <C=> is <CTRL>. That makes
  549. sense, right?)
  550.  
  551. You have a great collection of special
  552. graphics characters built into the C64.
  553. On a real machine, you can see them
  554. printed on the keys. For VICE users,
  555. you will just have to do some
  556. experimenting. Try this:
  557.  
  558. 10 ?"<C=R> <SPACE> <C=R><SPACE> <C=-R>
  559. 20 ?"<C=-Q> <Shift-]> <C=-W><SPACE>
  560.   <Shift-Minus>
  561. 30 ?"<C=-E> <SPACE> <C=-E><SPACE>
  562.   <C=-E> 
  563.  
  564. You should see HI in large letters. The
  565. most important keys are:
  566.  
  567. <C= Q> LEFT T
  568. <C= W> RIGHT T
  569. <C= E> DOWN T
  570. <C= R> UP T
  571. <C= A> UPPER LEFT CORNER
  572. <C= S> UPPER RIGHT CORNER
  573. <C= Z> LOWER LEFT CORNER
  574. <C= X> LOWER RIGHT CORNER
  575. <Shift ]> HORIZONAL LINE
  576. <Shift -> VERTICAL LINE
  577.  
  578. About the only letter you cannot make
  579. with these 10 graphic characters is X.
  580.  
  581. Well, that pretty much covers the
  582. basics of BASIC structures & controls.
  583. Now we have a bunch of commands,
  584. functions, & operations to learn. You
  585. will want to play with each of these
  586. commands to get familiar with them.
  587. Then keep this info handy as you begin
  588. programming. But mostly, have fun!
  589.